package testes;

import java.util.HashMap;
import java.util.HashSet;

import logica.locacao.RegistroDeLocacao;
import logica.util.Data;
import logica.util.Data.Mes;

import org.junit.Assert;
import org.junit.Test;

public class TestaRegistroDeLocacao {

	RegistroDeLocacao loc1;
	
	@Test
	public void testaGetsESets() throws Exception {
		
		loc1 = new RegistroDeLocacao();
		
		Assert.assertEquals(loc1.getCodigoDoCliente(), "");
		Assert.assertEquals(loc1.getDataEntrega(), null);
		Assert.assertEquals(loc1.getDataDevolucao(), null);
		Assert.assertEquals(loc1.getInfoVeiculos(), null);
		Assert.assertEquals(loc1.getCodigosDeVeiculosLocados(), null);
		
		try{
			loc1.setCodigoDoCliente(null);
			Assert.fail("Nao deveria ter entrado aqui.");
		}
		catch (Exception e){
			Assert.assertEquals("(#1) Mensagem de erro errada!", "\n \t <Codigo do cliente invalido!>", e.getMessage());
		}
		try{
			loc1.setCodigoDoCliente("");
			Assert.fail("Nao deveria ter entrado aqui.");
		}
		catch (Exception e){
			Assert.assertEquals("(#2) Mensagem de erro errada!", "\n \t <Codigo do cliente invalido!>", e.getMessage());
		}
		
		loc1.setCodigoDoCliente("10");
		Assert.assertEquals("(#4) Codigo do Cliente errado!", "10", loc1.getCodigoDoCliente());

		try{
			loc1.setDataEntrega(null);
			Assert.fail("Nao deveria ter entrado aqui.");
		}
		catch (Exception e){
			Assert.assertEquals("(#5) Mensagem de erro errada!", "\n \t <Data de locacao invalida!>", e.getMessage());
		}
				
		try{
			loc1.setDataDevolucao(null);
			Assert.fail("Nao deveria ter entrado aqui.");
		}
		catch (Exception e){
			Assert.assertEquals("(#8) Mensagem de erro errada!", "\n \t <Data de devolucao invalida!>", e.getMessage());
		}
		try{
			loc1.setDataEntrega(new Data(5, Mes.NOVEMBRO, 2010));
			loc1.setDataDevolucao(new Data(3, Mes.NOVEMBRO, 2010));
			Assert.fail("Nao deveria ter entrado aqui.");
		}
		catch (Exception e){
			Assert.assertEquals("(#9) Mensagem de erro errada!", "\n \t <Data de devolucao assumida como compromisso nao pode ser mais antiga que a data de locacao!>", e.getMessage());
		}
				
		try{
			loc1.setDataDevolucao(new Data(3, Mes.NOVEMBRO, 2010));
			loc1.setDataEntrega(new Data(5, Mes.NOVEMBRO, 2010));
			Assert.fail("Nao deveria ter entrado aqui.");
		}
		catch (Exception e){
			Assert.assertEquals("(#12) Mensagem de erro errada!", "\n \t <Data de devolucao assumida como compromisso nao pode ser mais antiga que a data de locacao!>", e.getMessage());
		}

		HashMap<Integer, HashSet<String>> mapaVeiculosLocados = new HashMap<Integer, HashSet<String>>();
		HashSet<String> conjuntoVeiculosLocados = new HashSet<String>();
		conjuntoVeiculosLocados.add("VEICULO");
		mapaVeiculosLocados.put(-1, conjuntoVeiculosLocados);
		
		try{
			loc1.setInfoVeiculos(mapaVeiculosLocados);
			Assert.fail("Nao deveria ter entrado aqui.");
		}
		catch (Exception e){
			Assert.assertEquals("(#13) Mensagem de erro errada!", "\n \t <Nivel de tanque invalido!>", e.getMessage());
		}

		mapaVeiculosLocados.put(105, conjuntoVeiculosLocados);
		
		try{
			loc1.setInfoVeiculos(mapaVeiculosLocados);
			Assert.fail("Nao deveria ter entrado aqui.");
		}
		catch (Exception e){
			Assert.assertEquals("(#13,5) Mensagem de erro errada!", "\n \t <Nivel de tanque invalido!>", e.getMessage());
		}
		
		mapaVeiculosLocados.remove(105);
		
		mapaVeiculosLocados.put(0, conjuntoVeiculosLocados);
		
		try{
			loc1.setInfoVeiculos(mapaVeiculosLocados);
		}
		catch (Exception e){
			Assert.assertEquals("(#14) Mensagem de erro errada!", "\n \t <Codigo do veiculo invalido!>", e.getMessage());
		}
		
		conjuntoVeiculosLocados.remove("VEICULO");
		conjuntoVeiculosLocados.add("");
		
		mapaVeiculosLocados.put(0, conjuntoVeiculosLocados);
		
		try{
			loc1.setInfoVeiculos(mapaVeiculosLocados);
		}
		catch (Exception e){
			Assert.assertEquals("(#15) Mensagem de erro errada!", "\n \t <Codigo de veiculo invalido!>", e.getMessage());
		}
		
		conjuntoVeiculosLocados.clear();
		conjuntoVeiculosLocados.add("1234567890");
		mapaVeiculosLocados.clear();
		mapaVeiculosLocados.put(10, conjuntoVeiculosLocados);
		
		loc1.setInfoVeiculos(mapaVeiculosLocados);
		
		System.out.println(loc1.getInfoVeiculos());
		
		Assert.assertEquals("(#17) Tamanho do mapa incorreto!", 1, loc1.getInfoVeiculos().size() );
		Assert.assertEquals("(#18) Mapa incorreto!", "{10=[1234567890]}", loc1.getInfoVeiculos().toString() );
		Assert.assertEquals("(#19) Conjunto incorreto!", "[1234567890]",loc1.getCodigosDeVeiculosLocados().toString());

		HashSet<String> conjuntoVeiculosLocados2 = new HashSet<String>();
		conjuntoVeiculosLocados2.add("0987654321");
		conjuntoVeiculosLocados2.add("1029384756");
		
		mapaVeiculosLocados.put(50, conjuntoVeiculosLocados2);
		
		loc1.setInfoVeiculos(mapaVeiculosLocados);
				
		Assert.assertEquals("(#21) Tamanho do mapa incorreto!", 2, loc1.getInfoVeiculos().size() );
		Assert.assertEquals("(#22) Mapa incorreto!", "{50=[1029384756, 0987654321], 10=[1234567890]}", loc1.getInfoVeiculos().toString() );
		Assert.assertEquals("(#23) Conjunto incorreto!", "[1234567890, 1029384756, 0987654321]",loc1.getCodigosDeVeiculosLocados().toString());
		
		
	}
}